package com.wg.core.serialize;

import com.wg.core.serialize.impl.BinarySerializer;
import com.wg.core.serialize.impl.FastJsonSerializer;
import com.wg.core.serialize.impl.ProtoBufSerializer;

import java.util.HashMap;
import java.util.Map;

/**
 * 序列化器工厂
 *
 * <p>
 * 该工厂类用于注册和获取不同类型的序列化器。
 * 它维护一个序列化器类型到序列化器实例的映射，
 * 并提供注册和获取序列化器的方法。
 * </p>
 *
 * @author 少爷123
 */
public class SerializerFactory {
    private static final Map<Integer, ISerializer> serializers = new HashMap<>();

    static {
        register(new FastJsonSerializer());
        register(new ProtoBufSerializer());
        register(new BinarySerializer());
    }

    /**
     * 注册序列化器
     *
     * <p>
     * 该方法用于注册一个序列化器，将其类型标识和实例添加到内部映射中。
     * </p>
     *
     * @param serializer 序列化器
     */
    public static void register(ISerializer serializer) {
        serializers.put(serializer.getType(), serializer);
    }

    /**
     * 获取序列化器
     *
     * <p>
     * 该方法根据指定的序列化器类型标识获取对应的序列化器实例。
     * 如果不存在对应的序列化器，抛出 IllegalArgumentException 异常。
     * </p>
     *
     * @param type 序列化器类型
     * @return 序列化器
     */
    public static ISerializer getSerializer(int type) {
        ISerializer serializer = serializers.get(type);
        if (serializer == null) {
            throw new IllegalArgumentException("Unknown serializer type: " + type);
        }
        return serializer;
    }
}
